package org.study.hadoop.md.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Properties;
/**
 * 日志工具类
 */
public class LogUtil {
	private static final String LOG_CONFIG = "config/log.properties";	//目录/配置文件
	private static final String LOG_DIR = "logDir";						//日志存放目录
	private static final String LOG_NAME = "logFile";					//日志名称
	private static LogUtil logUtil;										//LogUtil唯一实例
	private PrintWriter writer;											//文本输出流
	private static File dir;											//日志目录
	private static File file;											//日志文件
	
	/**
	 * 构造函数私有化禁止创建对象
	 */
	private LogUtil() {
		try {
			this.init();
		} catch (IOException e) {
			System.err.println("初始化失败...");
			e.printStackTrace();
		}
	}
	/**
	 * 获取LogUtil实例，如果为null则创建新的LogUtil
	 */
	public static LogUtil getLog() {
		if (logUtil == null) {
			logUtil = new LogUtil();
		}
		return logUtil;
	}
	/**
	 * 存入日志文件信息
	 */
	public synchronized void log(String message) {
		try {
			//其中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容
			//PrintWriter()中的第二个参数的含义是：自动将数据flush到文件中
			writer = new PrintWriter(new FileWriter(file, true), true);
			writer.println(DateUtil.formatDateAll(new Date()) + " ：" + message);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			this.close();
		}
	}
	/**
	 * 存入日志文件异常
	 */
	public synchronized void log(Exception ex) {
		try {
			//其中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容
			//PrintWriter()中的第二个参数的含义是：自动将数据flush到文件中
			writer = new PrintWriter(new FileWriter(file, true), true);
			writer.println(DateUtil.formatDateAll(new Date()) + " ：" + "---------------------------------------------------------> Exception Start:");
			ex.printStackTrace(writer);
			writer.println(DateUtil.formatDateAll(new Date()) + " ：" + "---------------------------------------------------------> Exception End!");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			this.close();
		}
	}
	/**
	 * 初始化文件日志目录、日志文件
	 */
	private void init() throws IOException {
		Properties prop = this.getProperties();
		if (prop != null) {
			String dirStr = prop.getProperty(LOG_DIR);
			String nameStr = prop.getProperty(LOG_NAME);
			dir = new File(dirStr);
			file = new File(dir, nameStr);
			if (!dir.exists()) {
				dir.mkdirs();
			}
			if (!file.exists()) {
				file.createNewFile();
			}
		} else {
			throw new FileNotFoundException("文件未找到");
		}
	}
	/**
	 * 加载日志配置文件
	 */
	private Properties getProperties() {
		Properties prop = new Properties();
		File file = new File(LOG_CONFIG);
		try (FileReader reader = new FileReader(file);) {
			if (reader != null) {
				prop.load(reader);
				return prop;
			}
		} catch (IOException e) {
			System.err.println("无法打开配置文件log.properties");
		}
		return null;
	}
	/**
	 * 关闭所有流
	 */
	private void close() {
//		logUtil = null;
		if (writer != null) {
			writer.close();
		}
	}
}
